package 二零年3月;
/*
* 插入。给定两个32位的整数N与M，以及表示比特位置的i与j。
* 编写一种方法，将M插入N，使得M从N的第j位开始，到第i位结束。
* 假定从j位到i位足以容纳M，也即若M = 10 011，那么j和i之间至少可容纳5个位。
* 例如，不可能出现j = 3和i = 2的情况，因为第3位和第2位之间放不下M。

示例1:
 输入：N = 10000000000, M = 10011, i = 2, j = 6
 输出：N = 10001001100
示例2:
 输入： N = 0, M = 11111, i = 0, j = 4
 输出：N = 11111

 //解题思路，首先肯定想到位运算,设位运算为元运算，则时间复杂度和空间复杂度均为O(1)
    位运算是真的一点也不懂，基础太差，有待复习。

  思路是：先把N的i~j位mask成0，再把M mask上去即可，（如果n位数不够，则在前面补0，再将M 按位计算mask上去)
* */
public class InterView0501 {
    public int insertBits(int N, int M, int i, int j) {
        N &= ~(((1 << (j - i + 1)) - 1) << i);   //将N 的 i到j位标记为0
        N |= (M << i);   //按位或将M标记到n上，因为从i开始，所以左移i
        return N;
    }
}
